﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "IGraphicsNode.h"

namespace gcmp
{
    /// \brief Element几何引用图形节点
    ///
    /// 1. 目前只支持存在刚体变换关系的形体之间进行共享。
    /// 2. 被用于共享的GraphicsElementShape所在的Element, 需将CategoryUid设置为 BICU_ELEMENT_GREP_HOLDER
    /// 3. 被用于共享的GraphicsElementShape内不应直接或间接的包含IGraphicsELementShapeReference节点。(用来约束GraphicsElementShapeHolder)
    /// 4. 包含IGraphicsElementShapeRefernce节点的IGraphicsElementShape应当有且只有一个子节点，且子节点的类型是IGraphicsElementShapeReference。(用来约束Reference)
    class GCMP_GRAPHICS_NODE_INTERFACE_EXPORT IGraphicsElementShapeReference : public IGraphicsNode
    {
        DEFINE_CAST_DERIVED(IGraphicsElementShapeReference, IGraphicsNode)
    
    public:
        /// \brief 析构器
        virtual ~IGraphicsElementShapeReference();

public:
 
        /// \brief 获取被引用的Element的id
        /// \return 被引用的目标Element的id
        virtual ElementId GetReferencedElementId() const = 0;

        /// \brief 获取相对于被引用的Element的转换矩阵
        /// \return 相对于被引用的Element的转换矩阵
        virtual Matrix4d GetTransformMatrix() const = 0;
  
    public:
        /// \brief 设置相对于被引用的Element的转换矩阵
        ///
        /// 目前仅支持包括平移、旋转、镜像等操作的刚体变换矩阵, 变换前后任意参与变换的两点间距离依旧保持不变。
        ///
        /// \param mat 相对于被引用的Element的转换矩阵
        /// \return bool  设置成功返回true, 否则返回false    
        virtual bool SetTransform(const Matrix4d& matrix) = 0;

    public:
        /// \brief 通过被引用的目标Element的id，转换矩阵，来创建默认的Element几何引用图形节点
        ///
        /// 目前仅支持包括平移、旋转、镜像等操作的刚体变换矩阵, 变换前后任意参与变换的两点间距离依旧保持不变。
        /// \param targetElemId 被引用的目标Element的id
        /// \param transform 相对于被引用的Element的转换矩阵
        /// \return Element几何引用图形节点
        static OwnerPtr<IGraphicsElementShapeReference> Create(const ElementId& targetElemId, const Matrix4d& transform);

        /// \brief 复制创建Element几何引用图形节点
        /// \param other 被复制的Element几何引用图形节点
        /// \return Element几何引用图形节点
        static OwnerPtr<IGraphicsElementShapeReference> Create(const IGraphicsElementShapeReference& other);
    };
}


